/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.cip.esymons.general.bc;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.cip.esymons.general.be.ColegiadoEspecialidad;
import org.cip.esymons.general.be.Directivos;

/**
 *
 * @author ADMINISTRADOR
 */
@Stateless
public class DirectivosFacade implements DirectivosFacadeLocal {
    @PersistenceContext
    private EntityManager em;

    public void create(Directivos directivos) {
        em.persist(directivos);
    }

    public void edit(Directivos directivos) {
        em.merge(directivos);
    }

    public void remove(Directivos directivos) {
        Directivos aux = em.merge(directivos);
        em.remove(aux);
    }

    public Directivos find(Object id) {
        return em.find(Directivos.class, id);
    }

    public List<Directivos> findAll() {

        List<Directivos> listaDirectivos = new ArrayList<Directivos>();
        try  {
            listaDirectivos = em.createQuery("select object(o) from Directivos as o " +
                    "order by o.dirfechaFin desc, o.carCodigo.fkAreCodigo.areNombre, o.carCodigo.carDescripcion").getResultList();
  
            return listaDirectivos;
        } catch (Exception ex) {
            System.out.println("ERROR: " + ex.getMessage());
            return null;
        }
    }

    public List<Directivos> listaDirectivosPeriodoActivo() {
        try  {
            return em.createQuery("select object(o) from Directivos as o where o.dirActivo = true").getResultList();
        } catch (Exception ex) {
            System.out.println("ERROR: " + ex.getMessage());
            return null;
        }
    }

     public List<Directivos> listaDirectivosPorPeriodo(Date fecha1, Date fecha2){

        List<Directivos> listaDirectivos = null;
        listaDirectivos = em.createQuery("select object(o) from Directivos as o where o.dirfechaInicio between ?1 and ?2 " +
                            "and o.dirfechaFin between ?1 and ?2 " +
                            "order by o.dirfechaFin desc, o.carCodigo.fkAreCodigo.areNombre, o.carCodigo.carDescripcion").setParameter(1,fecha1).setParameter(2,fecha2).getResultList();

        return listaDirectivos;
    }

    public List<Directivos> listaDirectivosPorFechaOrdenCIP(Date fecha1, Date fecha2){

        try{
            List<Directivos> listaDirectivos = null;
            ColegiadoEspecialidad colEsp;
            listaDirectivos = em.createQuery("select object(o) from Directivos as o where o.dirfechaInicio between ?1 and ?2 " +
                                "and o.dirfechaFin between ?1 and ?2 order by o.colCodigo.colnumeroCip").setParameter(1,fecha1).setParameter(2,fecha2).getResultList();

            for(int i=0; i<listaDirectivos.size();i++){

                colEsp = new ColegiadoEspecialidad();
                Long colCodigo = null;
                colCodigo = listaDirectivos.get(i).getColCodigo().getSolCodigo();

                colEsp = (ColegiadoEspecialidad) em.createQuery("select o from ColegiadoEspecialidad as o " +
                   "where o.cesPrioridad = true and o.colCodigo.solCodigo=?1").setParameter(1, colCodigo).getSingleResult();
                if(colEsp != null){
                    listaDirectivos.get(i).setColegiadoEspecialidad(colEsp);
                }
            }
            return listaDirectivos;
        }catch(Exception ex){
            return new ArrayList<Directivos>();
        }
    }

    public List<Directivos> listaDirectivosPorFechaOrdenApellidos(Date fecha1, Date fecha2){
        
        List<Directivos> listaDirectivos = null;
        ColegiadoEspecialidad colEsp;
        listaDirectivos =  em.createQuery("select object(o) from Directivos as o where o.dirfechaInicio between ?1 and ?2 " +
                              "and o.dirfechaFin between ?1 and ?2 order by o.colCodigo.personaNatural.perapellidoPaterno").setParameter(1,fecha1).setParameter(2,fecha2).getResultList();

        for(int i=0; i<listaDirectivos.size();i++){
            Long colCodigo =null;
            colEsp = new ColegiadoEspecialidad();

            colCodigo = listaDirectivos.get(i).getColCodigo().getSolCodigo();
            colEsp =  (ColegiadoEspecialidad) em.createQuery("select o from ColegiadoEspecialidad as o " +
               "where o.cesPrioridad = true and o.colCodigo.solCodigo=?1").setParameter(1, colCodigo).getSingleResult();

            if(colEsp != null){
                listaDirectivos.get(i).setColegiadoEspecialidad(colEsp);
            }
        }
        return listaDirectivos;
    }

    public List<Directivos> listaDirectivosPorFechaOrdenCargo(Date fecha1, Date fecha2){

        List<Directivos> listaDirectivos = null;
        ColegiadoEspecialidad colEsp;
        listaDirectivos =  em.createQuery("select object(o) from Directivos as o where o.dirfechaInicio between ?1 and ?2 " +
                              "and o.dirfechaFin between ?1 and ?2 order by o.carCodigo.fkAreCodigo.areNombre, o.carCodigo.carDescripcion").setParameter(1,fecha1).setParameter(2,fecha2).getResultList();

        for(int i=0; i<listaDirectivos.size();i++){
            Long colCodigo =null;
            colEsp = new ColegiadoEspecialidad();

            colCodigo = listaDirectivos.get(i).getColCodigo().getSolCodigo();
            colEsp =  (ColegiadoEspecialidad) em.createQuery("select o from ColegiadoEspecialidad as o " +
               "where o.cesPrioridad = true and o.colCodigo.solCodigo=?1").setParameter(1, colCodigo).getSingleResult();

            if(colEsp != null){
                listaDirectivos.get(i).setColegiadoEspecialidad(colEsp);
            }
        }
        return listaDirectivos;
    }

    public Directivos buscaPresidenteColegiatura(){
        try{
        return (Directivos) em.createQuery("select d from Directivos d " +
                "where d.carCodigo.fkAreCodigo.areNombre like 'Comision Colegia%' " +
                "and d.carCodigo.carDescripcion like 'preside%' and d.dirActivo = true").getSingleResult();
        }catch(Exception ex){
            return null;
        }
    }

    public Directivos buscaPrimerVocal(){

        try{
        return (Directivos) em.createQuery("select d from Directivos d " +
                "where d.carCodigo.carDescripcion like 'Vocal 1%' and d.dirActivo = true").getSingleResult();
        }catch(Exception ex){
            return null;
        }
    }

    public Directivos buscaSegundoVocal(){
    try{
        return (Directivos) em.createQuery("select d from Directivos d " +
                "where d.carCodigo.carDescripcion like 'Vocal 2%' and d.dirActivo = true").getSingleResult();
        }catch(Exception ex){
            return null;
        }
    }

    public Directivos buscaDirSecretario(){
        try{
        return (Directivos) em.createQuery("select d from Directivos d " +
                "where d.carCodigo.fkAreCodigo.areNombre like 'junta directiva' and " +
                " d.carCodigo.carDescripcion like 'director secret%' and d.dirActivo = true").getSingleResult();
        }catch(Exception ex){
            return null;
        }
    }

    public Directivos buscaDecano(){
       try{
        return (Directivos) em.createQuery("select d from Directivos d " +
                "where d.carCodigo.fkAreCodigo.areNombre like 'junta directiva' and " +
                "d.carCodigo.carDescripcion like 'decano' and d.dirActivo = true").getSingleResult();
        }catch(Exception ex){
            return null;
        }
    }

    public Directivos buscaSecretariaGeneral(){
       try{
        return (Directivos) em.createQuery("select d from Directivos d " +
                "where d.carCodigo.carDescripcion like 'director(a) secretario(a) %' and d.dirActivo = true").getSingleResult();
        }catch(Exception ex){
            return null;
        }
    }

    public Directivos buscaPresidenteCapitulo(String capitulo){
       try{
        return (Directivos) em.createQuery("select d from Directivos d " +
                "where d.carCodigo.fkAreCodigo.areNombre like 'Capitulo de "+capitulo+"' and  " +
                "d.carCodigo.carDescripcion like 'Presidente' and d.dirActivo = true").getSingleResult();
        }catch(Exception ex){
            return null;
        }
    }

    public Directivos buscaSecretarioCapitulo(String capitulo){
       try{
        return (Directivos) em.createQuery("select d from Directivos d " +
                "where d.carCodigo.fkAreCodigo.areNombre like 'Capitulo de "+capitulo+"' and  " +
                "d.carCodigo.carDescripcion like 'Secretario' and d.dirActivo = true").getSingleResult();
        }catch(Exception ex){
            return null;
        }
    }

    public Directivos buscaVocalCapitulo(String capitulo){
       try{
        return (Directivos) em.createQuery("select d from Directivos d " +
                "where d.carCodigo.fkAreCodigo.areNombre like 'Capitulo de "+capitulo+"' and  " +
                "d.carCodigo.carDescripcion like 'Vocal' and d.dirActivo = true").getSingleResult();
        }catch(Exception ex){
            return null;
        }
    }
}
